<?php
namespace app\user\controller;//定义以下类所在的命名空间
use think\View;//引用命名空间
use think\Controller;
use think\Session;
use think\Db;
use app\common\model\Users;

class Orders extends Controller//定义一个类（控制器）,继承TP5的Controller类
{
    //显示购物车
	public function shoppingcar()
	{   
		$uname=Session::get("username");//取已登录的用户名
		if(empty($uname)){
			$this->error("请先登录", url('user/index/login'));//未登录，跳转到登录页
		}
		//执行此查询：select p.pId, p.pName,number, p.pImg, p.pPrice, p.pPrice*number totalPrice  from shoppingcart s inner join 
		// products p on  p.pId=s.pId and uname='$uname'
		$items=Db::table('shoppingcart')->alias('s')->join('products p','s.pid = p.pid')->where('s.uname',$uname)->field('p.pId, p.pName,s.number, p.pImg, p.pPrice, p.pPrice*s.number as totalPrice')->select();
		$this->assign('items',$items);//为前台模板变量绑定值
		$sumPrice=0;
		foreach($items as $item){//计算总价
			$sumPrice +=$item['totalPrice'];
		}
		$this->assign('sumPrice',$sumPrice);//为前台模板变量绑定值
		return view();//返回视图	
	}
    //修改购物车(未对数据进行有效性验证，请自行实现)
	public function updateCar($id="",$num=1)
	{ //传递过来的$id的值形如number12，后面的数字才是真正的id值
		$id=substr($id, 6);//取出商品的id
		$uname=Session::get("username");//取已登录的用户名
		try{
			//修改记录
            Db::name('shoppingcart')->where('uname',$uname)->where('pid', $id)->update(['number' => $num]);
		}
		catch(\Exception $e){  //捕获异常
			return "捕获异常，修改失败";
    		//$this->error($e->getMessage());
		}
		return "ok";
	}
	//删除购物车(未对数据进行有效性验证，请自行实现)
	public function deleteItem($id="")
	{ 
		$uname=Session::get("username");//取已登录的用户名
		try{
			//删除记录
        Db::name('shoppingcart')->where('uname',$uname)->where('pid', $id)->delete();
		}
		catch(\Exception $e){  //捕获异常			
    		$this->error($e->getMessage());
		}
		$this->success("删除成功");
	}
	//创建订单
	public function createOrder()
	{ 
		$uname=Session::get("username");//取已登录的用户名
		if(empty($uname)){
			$this->error("请先登录", url('user/index/login'));//未登录，跳转到登录页
		}
		$orderDate=date("Y-m-d H:i:s");//下单时间日期
		$status="未付款"; //默认订单状态
		$orderId=(string)date("Y-m-d-H-i-s").mt_rand(100,999);//在此订单号由日期加3位随机数组成

		//查订单的总价格
//select sum(p.pPrice*number) sumPrice  from shoppingcart s inner join products p on  p.pId=s.pId and uname='$uname'
		$sum=Db::table('shoppingcart')->alias('s')->join('products p','s.pid = p.pid')->where('s.uname',$uname)->field('sum(p.pPrice*s.number) as sumPrice')->find();
		$orderData = ['orderId' => $orderId,'uName' => $uname,'orderDate' => $orderDate, 'totalPrice' => $sum['sumPrice'],  'status'=>$status];//构造数据
//select p.pId, p.pName,number, p.pImg, p.pPrice, p.pPrice*number totalPrice  from shoppingcart s inner join products p on  p.pId=s.pId and uname='$uname'
		$items=Db::table('shoppingcart')->alias('s')->join('products p','s.pid = p.pid')->where('s.uname',$uname)->field('p.pId, p.pName,s.number, p.pImg, p.pPrice, p.pPrice*s.number as totalPrice')->select();//查购物车
        if(empty($items)){
			$this->error("购物车中没有商品不能下单");
		} 		
		// 启动事务,手动控制事务处理
		Db::startTrans();
		try{
			Db::name('orders')->insert($orderData);
		    foreach($items as $item){
				//构造数据
				$detailData = ['orderId' => $orderId,'totalPrice' => $item['totalPrice'], 'pId' => $item['pId'],'number'=>$item['number']];
				Db::name('orderdetails')->insert($detailData);		//增加记录	
			}
			//删除该用户的购物车中的所有记录
			Db::name('shoppingcart')->where('uname',$uname)->delete();
		    Db::commit(); // 提交事务   
		} catch (\Exception $e) {    
		    Db::rollback();// 回滚事务
		    $this->error($e->getMessage());
		}  		
		$this->success("下单成功","myorders");//下单成功转到我的订单页面
	}
	//显示订单
	public function myorders()
	{   
		$uname=Session::get("username");//取已登录的用户名
		if(empty($uname)){
			$this->error("请先登录","user/index/login");//未登录，跳转到登录页
		}
		$items=Db::name('orders')->where('uname',$uname)->order('orderId','desc')->select();
		$this->assign('items',$items);//为前台模板变量绑定值		
		return view();//返回视图	
	} 
		//显示订单详情
	public function orderDetail($id='')
	{   
		$uname=Session::get("username");//取已登录的用户名
		if(empty($uname)){
			$this->error("请先登录","user/index/login");//未登录，跳转到登录页
		}
		//执行查询：select p.pId, p.pName,number, p.pImg, p.pPrice, totalPrice  from orderDetails s inner join products p on  p.pId=s.pId and orderId='$orderId'

		$items=Db::table('orderdetails')->alias('o')->join('products p','o.pid = p.pid')->where('o.orderId',$id)->field('p.pId, p.pName,o.number, p.pImg, p.pPrice, o.totalPrice')->select();
		$this->assign('items',$items);//为前台模板变量绑定值
		$sumPrice=0;
		foreach($items as $item){//计算总价
			$sumPrice +=$item['totalPrice'];
		}
		$this->assign('sumPrice',$sumPrice);//为前台模板变量绑定值
		return view();//返回视图
	} 

	/**
	 * 处理订单付款
	 * @param string $id 订单ID
	 */
	public function payment($id = "")
	{
		$uname = Session::get("username");
		if(empty($uname)){
			$this->error("请先登录", url('user/index/login'));
		}
		
		// 检查订单是否存在且属于当前用户
		$order = Db::name('orders')
				->where('orderId', $id)
				->where('uName', $uname)
				->find();
				
		if(empty($order)){
			$this->error("订单不存在或不属于您");
		}
		
		// 检查订单状态是否为"未付款"
		if($order['status'] != '未付款'){
			// 检查订单是否已经是"已付款"状态
			$currentStatus = Db::name('orders')
							->where('orderId', $id)
							->value('status');
			
			if($currentStatus == '已付款'){
				$this->success("订单已付款", url('user/orders/myorders'));
			} else {
				$this->error("订单当前状态不允许付款");
			}
		}
		
		// 启动事务
		Db::startTrans();
		try {
			// 更新订单状态为"已付款"
			$result = Db::name('orders')
					->where('orderId', $id)
					->update(['status' => '已付款']);
			
			// 检查更新是否成功
			if($result === false) {
				Db::rollback();
				$this->error("付款状态更新失败");
			}
			
			Db::commit();
			$this->success("付款成功", url('user/orders/myorders'));
		} catch (\Exception $e) {
			Db::rollback();
			
			// 检查订单状态是否已经是"已付款"
			$currentStatus = Db::name('orders')
							->where('orderId', $id)
							->value('status');
			
			if($currentStatus == '已付款'){
				$this->success("付款已完成", url('user/orders/myorders'));
			} else {
				$this->error("付款失败: " . $e->getMessage());
			}
		}
	}

	/**
	 * 删除订单
	 * @param string $id 订单ID
	 */
	public function orderDelete($id = "")
	{
		$uname = Session::get("username");
		if(empty($uname)){
			$this->error("请先登录", url('user/index/login'));
		}
		
		// 检查订单是否存在且属于当前用户
		$order = Db::name('orders')
				->where('orderId', $id)
				->where('uName', $uname)
				->find();
				
		if(empty($order)){
			$this->error("订单不存在或不属于您");
		}
		
		// 检查订单状态是否为"未付款"（只有未付款订单可以删除）
		if($order['status'] != '未付款'){
			$this->error("只有未付款订单可以删除");
		}
		
		// 启动事务
		Db::startTrans();
		try {
			// 先删除订单详情
			$detailResult = Db::name('orderdetails')
				->where('orderId', $id)
				->delete();
				
			// 再删除订单
			$orderResult = Db::name('orders')
				->where('orderId', $id)
				->delete();
				
			// 检查删除是否成功
			if($detailResult === false || $orderResult === false) {
				Db::rollback();
				$this->error("订单删除失败");
			}
			
			Db::commit();
			$this->success("订单删除成功", url('user/orders/myorders'));
		} catch (\Exception $e) {
			Db::rollback();
			// 检查订单是否真的不存在了（可能已被删除）
			$checkOrder = Db::name('orders')->where('orderId', $id)->find();
			if(empty($checkOrder)) {
				$this->success("订单已删除", url('user/orders/myorders'));
			} else {
				$this->error("订单删除失败: " . $e->getMessage());
			}
		}
	}
  
	/**
	* 确认收货
	* @param string $id 订单ID
	*/
	public function receive($id = "")
	{
		$uname = Session::get("username");
		if(empty($uname)){
			$this->error("请先登录", url('user/index/login'));
		}
		
		// 检查订单是否存在且属于当前用户
		$order = Db::name('orders')
				->where('orderId', $id)
				->where('uName', $uname)
				->find();
				
		if(empty($order)){
			$this->error("订单不存在或不属于您");
		}
		
		// 检查订单状态是否为"已发货"
		if($order['status'] != '已发货'){
			// 检查订单是否已经是"已完成"状态
			$currentStatus = Db::name('orders')
							->where('orderId', $id)
							->value('status');
			
			if($currentStatus == '已完成'){
				$this->success("订单已完成", url('user/orders/myorders'));
			} else {
				$this->error("当前订单状态不允许确认收货");
			}
		}
		
		// 启动事务
		Db::startTrans();
		try {
			// 更新订单状态为"已完成"
			$result = Db::name('orders')
					->where('orderId', $id)
					->update([
						'status' => '已完成',
						'receiveTime' => date('Y-m-d H:i:s') // 添加收货时间
					]);
			
			// 检查更新是否成功
			if($result === false) {
				Db::rollback();
				$this->error("确认收货失败");
			}
			
			Db::commit();
			$this->success("确认收货成功", url('user/orders/myorders'));
		} catch (\Exception $e) {
			Db::rollback();
			
			// 检查订单状态是否已经是"已完成"
			$currentStatus = Db::name('orders')
							->where('orderId', $id)
							->value('status');
			
			if($currentStatus == '已完成'){
				$this->success("收货已完成", url('user/orders/myorders'));
			} else {
				$this->error("确认收货失败: " . $e->getMessage());
			}
		}
	}  
}
